const { Sequelize, DataTypes, Model } = require('sequelize');
const sequelize = require('../config/database');

/**
 * 用户投币视频模型
 * 记录用户对视频的投币行为
 */
class UserCoinVideo extends Model {
  /**
   * 用户为视频投币
   * @param {number} userId - 用户ID
   * @param {number} videoId - 视频ID
   * @param {number} coinValue - 投币数量
   * @returns {Promise<UserCoinVideo>} - 创建的投币记录
   */
  static async coinVideo(userId, videoId, coinValue) {
    const [record, created] = await this.findOrCreate({
      where: { user_id: userId, video_id: videoId },
      defaults: { coin_value: coinValue }
    });
    
    // 如果已存在记录，则更新投币数量
    if (!created) {
      record.coin_value = coinValue;
      await record.save();
    }
    
    return record;
  }
  
  /**
   * 查询用户是否已对视频投币
   * @param {number} userId - 用户ID
   * @param {number} videoId - 视频ID
   * @returns {Promise<boolean>} - 是否已投币
   */
  static async hasCoined(userId, videoId) {
    const record = await this.findOne({
      where: { user_id: userId, video_id: videoId }
    });
    return !!record;
  }
  
  /**
   * 获取用户为某个视频投币的数量
   * @param {number} userId - 用户ID
   * @param {number} videoId - 视频ID
   * @returns {Promise<number>} - 投币数量
   */
  static async getUserCoinValue(userId, videoId) {
    const record = await this.findOne({
      where: { user_id: userId, video_id: videoId }
    });
    return record ? record.coin_value : 0;
  }
  
  /**
   * 获取视频的总投币数
   * @param {number} videoId - 视频ID
   * @returns {Promise<number>} - 总投币数
   */
  static async getVideoTotalCoins(videoId) {
    const result = await this.sum('coin_value', {
      where: { video_id: videoId }
    });
    return result || 0;
  }
  
  /**
   * 获取用户为某个视频投币的数量
   * @param {number} userId - 用户ID
   * @param {number} videoId - 视频ID
   * @returns {Promise<number>} - 投币数量
   */
  static async getUserCoinValue(userId, videoId) {
    const record = await this.findOne({
      where: { user_id: userId, video_id: videoId }
    });
    return record ? record.coin_value : 0;
  }
}

// 直接初始化模型
UserCoinVideo.init({
    // 用户ID，复合主键
    user_id: {
      type: DataTypes.BIGINT,
      primaryKey: true,
      allowNull: false,
      comment: '用户ID'
    },
    
    // 视频ID，复合主键
    video_id: {
      type: DataTypes.BIGINT,
      primaryKey: true,
      allowNull: false,
      comment: '视频ID'
    },
    
    // 投币数量
    coin_value: {
      type: DataTypes.INTEGER,
      allowNull: false,
      defaultValue: 1,
      comment: '投币数量'
    },
    
    // 创建时间
    created_at: {
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: DataTypes.NOW,
      comment: '创建时间'
    },
    
    // 更新时间
    updated_at: {
      type: DataTypes.DATE,
      allowNull: false,
      defaultValue: DataTypes.NOW,
      onUpdate: DataTypes.NOW,
      comment: '更新时间'
    },
    
    // 软删除时间
    deleted_at: {
      type: DataTypes.DATE,
      allowNull: true,
      comment: '删除时间'
    }
  }, {
    sequelize,
    tableName: 'user_coin_video',
    timestamps: true,
    paranoid: true,
    underscored: true,
    indexes: [
      { fields: ['user_id'] },
      { fields: ['video_id'] }
    ],
    comment: '用户投币视频表'
  });

module.exports = UserCoinVideo;